// 根据vue 文档可以发现下面的七种数组方法被重写
// push() pop() shift() unshift() splice() sort() reverse()
// 因为这些是对数组内部元素操作，例如push 这种增加操作需要我们对新值进行
// 新的getter 和 setter 操作监听


// 1. 先获取js 原生数组中的所有方法
let oldArrayMethods = Array.prototype


export const arrayMethods = Object.create(oldArrayMethods);


// 需要重新 做处理的数组方法
const methods = [
    'push',
    'shift',
    'unshift',
    'pop',
    'sort',
    'splice',
    'reverse'
]
// 重新对这个七个数组方法做加工
methods.forEach(method => {
    arrayMethods[method] = function (...args) {
        // 调用原生的数组方法
        const result = oldArrayMethods[method].apply(this, args);
        let inserted; // 当前用户插入的元素
        // 我们要处理的是原生这些方法加进来的值
        switch (method) {
            case 'push':
            case 'unshift':
                inserted = args;
                break;
            case 'splice': // 3个  新增的属性 splice 有删除 新增的的功能 arr.splice(0,1,{name:1})
                inserted = args.slice(2)
            default:
                break;
        }
        // 如果有新增的值，需要对这个新增的值进行getter 和setter 
        // 之前每个value 内部已经存储了 observe 现在需要调用专门处理数组的observerArray方法
        let ob = this.__ob__;
        if (inserted) ob.observerArray(inserted); // 将新增属性继续观测
        return result
    }

})